package com.java.operator;

/**
 * 位运算[<< >> >>> & | ^ ~]：直接对二进制形式的补码进行运算
 */
public class Bit {
    public static void main(String[] args) {
        Integer integer = -7;
        System.out.println("     原始数据：" + Integer.toBinaryString(integer) + "\t" + integer);
        // 11111111111111111111111111111001 -7
        
        // <<表示左移，最高位丢弃最低位补0
        Integer left = integer << 3; // 相当于-7的补码 * 2 ^ 3
        System.out.println("      <<左移：" + Integer.toBinaryString(left) + "\t" + left);
        // 11111111111111111111111111001000	-56
        
        // >>表示右移，最高位为何值则最高位补何值最低位丢弃
        Integer right = integer >> 3;
        System.out.println("      >>右移：" + Integer.toBinaryString(right) + "\t" + right);
        // 11111111111111111111111111111111	-1
        
        // >>>表示无符号右移，最高位补0最低位丢弃
        Integer unsignRight = integer >>> 3;
        System.out.println(">>>无符号右移：" + Integer.toBinaryString(unsignRight) + "\t" + unsignRight);
        // 00011111111111111111111111111111	536870911
        
        
        Integer integer1 = -5, integer2 = -7;
        System.out.println("原始数据：" + Integer.toBinaryString(integer1) + "\t" + integer1);
        System.out.println("原始数据：" + Integer.toBinaryString(integer2) + "\t" + integer2);
        // 11111111111111111111111111111011	-5
        // 11111111111111111111111111111001 -7
        
        // &表示按位与，有0则0
        Integer and = integer1 & integer2;
        System.out.println("    &与：" + Integer.toBinaryString(and) + "\t" + and);
        // 11111111111111111111111111111001	-7
        
        // |表示按位或，有1则1
        Integer or = integer1 | integer2;
        System.out.println("    |或：" + Integer.toBinaryString(or) + "\t" + or);
        // 11111111111111111111111111111011	-5
        
        // ^表示按位异或，相同则0不同则1
        Integer xor = integer1 ^ integer2;
        System.out.println("  ^异或：" + Integer.toBinaryString(xor) + "\t" + xor);
        // 00000000000000000000000000000010 2
        
        // ~表示按位取反，0取1且1取0
        Integer anti = ~integer1;
        System.out.println("  ~取反：" + Integer.toBinaryString(anti) + "\t" + anti);
        // 00000000000000000000000000000100 4
        
        
        // 请用最有效的方式计算2*8的结果：2<<3
        
        // 实现两个整数交换
        // 1：三方变量temp
        // 2：位异或 a=a^b;b=a^b;a=a^b;
        // 3：变量相加 a=a+b;b=a-b;a=a-b;
        // 4：b=(a+b)-(a=b)
    }
}
